#include<stdio.h>
#include<signal.h>
#include<string.h>
#include<unistd.h>
 
#define 	MAXARGS		20
#define 	ARGLEN		100
 
int main()
{
	char *arglist[MAXARGS + 1];
	int numargs;
	char argbuf[ARGLEN]; 
	char *makestring();
 
	numargs = 0;
 
	while(numargs < MAXARGS)
	{
		printf("Arg[%d]?", numargs);
		if(fgets(argbuf, ARGLEN, stdin) && *argbuf != '\n')
			arglist[numargs ++] = makestring(argbuf);
		else
		{
			if(numargs > 0) 
			{
				arglist[numargs] = NULL;
				execute(arglist);
				numargs = 0;
			}
		}
	}
 
	return 0;
}
 
int execute(char* arglist[])
{
/*
*#include<unistd.h> 
*int execlp(const char* file, const char* argv ...)
* eg. execlp("ps","ps","-au","-x",(char*)0);
*    1.最后一个参数必须是(char*)0， 如果不强制转换成char*，就会自动转换成int* 有未知的错误。
*    2.第一个参数是要运行的文件，会在环境变量PATH中查找file.
*    3.失败会返回－1， 成功无返回值，但是，会在当前进程运行，执行成功后，直接结束当前进程。可以在子进程中运行。
*    4.第二个参数，是一个参数列表，如同在shell中调用程序一样，参数列表为0，1，2，3……因此，ps作为第0个参数，需要重复一遍
*    int execvp(const char* file, const char* argv[]);  argv列表最后一个必须是 NULL
*/
	execvp(arglist[0], arglist);
	perror("execvp failed");
	exit(1);
}
 
char* makestring(char *buf)
{
	char *cp, *malloc();
 
	buf[strlen(buf) - 1] = '\0';
	cp = malloc(strlen(buf) + 1);
 
	if(cp == NULL)
	{
		fprintf(stderr, "no memory\n");
		exit(1);
	}
	strcpy(cp, buf);
	return cp;
}